/******************************************************************************
 *      Mestrado em Ciência da Computação - UFMS
 *		Redes de Computadores - Prof. Dr. Ronaldo Alves Ferreira
 *		Alunos: Geraldo Landre, Marcel Tolentino, Vinícius Bueno
 *****************************************************************************/
/* tcballoc.c - tcballoc */

#include "defines.h"
#include "tcpfms.h"
#include "tcb.h"

/*------------------------------------------------------------------------
 * tcballoc - alocar um TCB (Bloco de Controle de Transmissão)
 *------------------------------------------------------------------------
 */
struct tcb * tcballoc(void)
{
    struct	tcb	*ptcb;
    int	slot;
    
    sem_wait(&tcps_tmutex);
    // look for a free TCB
    slot = sync_dequeue(tcbqueue);
    ptcb = tcbtab[slot];
    
    ptcb->tcb_dvnum = slot;
    ptcb->tcb_state = TCPS_CLOSED;
    sem_init(&(ptcb->tcb_mutex), 0, 0);

    printf("[tcballoc]: TCPS_CLOSED: %d\n", ptcb->tcb_dvnum);
    sem_post(&tcps_tmutex);
    return ptcb;
}
